const path = require('path')
const webpack = require('webpack')
const { merge } = require('webpack-merge') // 合并配置文件
const webpackConfigBase = require('./webpack.base.config') // 引入公共配置文件
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin') // 提高 TypeScript 编译速度
const Dotenv = require('dotenv-webpack') // .env 配置
const PORT = 8800 // 端口号
const EslintWebpackPlugin = require('eslint-webpack-plugin')
// const DllReferencePlugin = require('webpack/lib/DllReferencePlugin') // 引入 DllReferencePlugin

const webpackConfigDev = {
  mode: 'development',
  devtool: 'eval-source-map',
  plugins: [
    new ForkTsCheckerWebpackPlugin({
      async: true, // 异步检查
      typescript: {
        configFile: path.resolve(__dirname, '../tsconfig.json') // 指定 Ts 配置文件
      }
    }),
    new Dotenv({
      path: path.resolve(__dirname, '../.env.development') // 指定使用的环境文件
    }),
    new EslintWebpackPlugin({
      extensions: ['js', 'jsx', 'ts', 'tsx'],
      context: path.resolve(__dirname, '../src'), // 指定上下文
      exclude: 'node_modules',
      emitError: true, // 发现的错误将始终发出
      emitWarning: true, // 发现的警告将始终发出
      failOnError: false, // 如果有任何错误，将导致模块构建失败
      failOnWarning: false, // 如果有任何警告，将导致模块构建失败
      quiet: false, // 不向控制台输出警告信息
      fix: true, // 自动修复
      cache: true, // 缓存
      cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslint'), // 缓存位置
      overrideConfig: {
        parser: '@typescript-eslint/parser', // 指定解析器
        parserOptions: {
          ecmaVersion: 'latest', // 指定 ECMAScript 版本
          sourceType: 'module', // 指定源代码类型
          ecmaFeatures: {
            jsx: true
          }
        }
      }
    })
    // 告诉 Webpack 使用了哪些动态链接库
    // new DllReferencePlugin({
    //   manifest: require(path.resolve(__dirname, '../dist/dll/react.manifest.json'))  // 描述 react 动态链接库的文件内容
    // })
  ],
  devServer: {
    static: {
      directory: undefined // 启动静态文件目录
    },
    client: {
      overlay: false // 报错蒙版
    },
    // 当使用 HTML5 History API 是否应该返回 index.html 页面，而不是返回 404 页面，正确地重定向到主应用程序
    historyApiFallback: true, // history 路由404问题
    hot: true, // 开启热更新
    compress: false, // gzip 压缩 - 开发环境不开启提升热更新速度
    host: 'localhost',
    port: PORT, // 端口号
    open: true // 自动打开浏览器
  },
  performance: false // 关闭性能提示
}
module.exports = merge(webpackConfigBase, webpackConfigDev)
